# 1. 请写出列表支持的所有方法及说明（例如: append 向列表末尾添加元素）
# 答：
# （1）列表.index   查看指定数据的索引位置，重复的数据需指定num来确定位置
# 用法：列表.index(数据,num)
# 例子：
example = ['a',123,0,[5,6,7],'def',123]
print(example.index(123))
print(example.index(123,2))
# （2）列表.insert    在指定位置插入数据
# 用法：列表.insert(索引，数据)
# 例子：
example.insert(2,'D50')
print(example)
# (3) 列表.append     向列表末尾添加数据
# 用法：列表.append(数据)
# 例子：
example.append('123')
print(example)
# (4) 列表.extend     将一个列表的数据追加到另一个列表中
# 用法: 列表.extend(列表2)
# 例子：
example2 = [1,3,5]
(example.extend(example2))
print(example)
# (5) 列表[索引] = 数据   修改指定索引数据
# 例子：
example[0] = 'b'
print(example)
# (6) 列表.remove[数据]    删除指定数据，只删除第一个出现的
# 例子：
example.remove('def')
print(example)
# (7) 列表.pop    删除末尾的数据 ；列表.pop(索引)  删除指定索引的数据
# 例子：
example.pop()
print(example)
example.pop(0)
print(example)
# (8) len(列表) 统计列表长度
# 例子：
print(len(example))
# (9) 列表.count(数据)  统计一个数据在列表中的数量
# 例子：
print(example.count(123))
# (10) 列表.sort()  升序   列表.sort(reverse)   降序    列表.reverse   逆序
# 例子：
example = [1,5,2,3]
example.sort()
print(example)
example.sort(reverse=True)
print(example)
example.reverse()
print(example)
# (11) 数据 in 列表  判断数据是否在列表中
# 例子：
result = 3 in example
print(result)
# (12) 列表.clear   清空列表
# 例子：
example.clear()
print(example)

# 2. 说明列表的浅拷贝和深拷贝的区别
# 答：浅拷贝是只复制出来的对象仍引用源对象的内存地址，赋值改变后，引用的内存地址的值也会改变，所以源对象的值也会改变（类似linux中的软连接）
#     深拷贝是只复制出来的对象新建了一个内存地址，复制对象的值改变后不影响源对象的值（类似linux中的硬链接）

# 3. 说明列表和元组的相同点和不同点
# 相同点：都是有序的，可通过索引查询，都可以存储不同类型的元素
# 不同点：列表是可迭代的容器，而元组的元素不可变（注意：如果元组中的某个元素是可变的，比如列表，那这个列表里的元素可变）

# 4. 请写出字符串支持的所有方法及说明（例如: lower 返回字符串的小写）
# （1）统计字符串的长度
ex_str = 'hello world'
print(len(ex_str))
# （2） 统计某个字符出现的次数.count(str,start,end)
print(ex_str.count('o'))
print(ex_str.count('o',0,5))
# (3) 查看索引位置
print(ex_str.index('ll'))
# (4) 查找字符,find(str,start,end)找到返回0，没找到返回-1
print(ex_str.find('he'))
print(ex_str.find('o',0,2))
# (5) 字符分割
print(ex_str.split('o')) #移除字符串指定的字符，默认是空格
# (6) 字符拼接
print(' '.join(ex_str))
# (7) 字符去除首位空白字符或指定字符
name1 = ' D50" '
name2 = '"leo'
print(name1.strip())
print(name2.strip('"'))
# (8) 字符大小写转换
print(ex_str.capitalize())  #将字符串的第一个字符转换为大写，其他字符转换为小写。
print(ex_str.lower())  #将字符串中的所有字符转换为小写。
print(ex_str.upper())  #将字符串中的所有字符转换为大写。
print(ex_str.title())  #将字符串中的每个单词的首字母转换为大写。
# (9) 替换
print(ex_str.replace('wo','de'))   #将字符串中的指定的字符替换为新的字符
# (10) 首尾判断
print(ex_str.startswith('he'))     #判断字符串是否以指定字符开头
print(ex_str.endswith('dl'))       #判断字符串是否以指定字符结尾
# 5. 有如下一个
# 字符串变量logs，请统计出每种请求类型的数量（提示：空格分割的第2列是请求类型），得到如下输出：
# POST 2
# GET 3
#
# 下边是logs变量：
logs = '''
111.30.144.7 "POST /mock/login/?t=GET HTTP/1.1" 200
111.30.144.7 "Get /mock/users/?t=POST HTTP/1.1" 200
111.13.100.92 "Post /mock/login/ HTTP/1.1" 200
223.88.60.88 "GET /mock/users/?t=POST HTTP/1.1" 200
111.30.144.7 "GET /mock/users/ HTTP/1.1" 200
'''
request_type = []
uniq_type = []
line_list = (logs.strip().splitlines())
for line in line_list:
    request_type.append(line.split()[1].strip('"').upper())
for type in request_type:
    if type not in uniq_type:
        uniq_type.append(type)
for type in uniq_type:
    print(type,request_type.count(type))

